<?php

require_once dirname(__FILE__).'/../lib/acreditacionGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/acreditacionGeneratorHelper.class.php';

/**
 * acreditacion actions.
 *
 * @package    BecArTe
 * @subpackage acreditacion
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class acreditacionActions extends autoAcreditacionActions
{
  public function executeBatchValidar(sfWebRequest $request)
  {
    $ids = $request->getParameter('ids');

    $acreditaciones = Doctrine_Query::create()
      ->from('Acreditacion')
      ->whereIn('id', $ids)
      ->andWhere('valido = FALSE')
      ->execute();

    foreach ($acreditaciones as $ac)
    {
      $ac->setValido(true);
      $ac->save();
    }

    $this->getContext()->getConfiguration()->loadHelpers('I18N');
    $this->getUser()->setFlash('notice',
           format_number_choice(
             '[0] No se validó ninguna acreditación, ya estaban validadas. |[1] Una acreditación fue validada.|(1,+Inf] %count% acreditaciones fueron validadas.',
             array('%count%' => count($acreditaciones)),
             count($acreditaciones)
           ));    
    $this->redirect('@acreditacion');
  }
  

  // Al editar, uso el formulario adecuado segun la subclase que sea
  protected function createForm($ac) {
    $claseForm = 'Acreditacion'.$ac->getTipoRequisito().'Form';
    $form = new $claseForm($ac);
    //Estamos desde la ficha de edicion de la acreditacion, no tiene sentido
    // el check para quitar de la solicitud (ya viene puesto porq se usa casi 
    // siempre embebido)
    unset($form['borrar']);
    return $form;
  }


  public function executeEdit(sfWebRequest $request)
  {
    $this->acreditacion = $this->getRoute()->getObject();
    $this->form = $this->createForm($this->acreditacion);
  }


  public function executeUpdate(sfWebRequest $request)
  {
    $this->acreditacion = $this->getRoute()->getObject();
    $this->form = $this->createForm($this->acreditacion);

    $this->processForm($request, $this->form);

    $this->setTemplate('edit');
  }


  //para filtro por alumno
  protected function buildQuery(){
    $qry = parent::buildQuery();    
    $filtros = $this->getFilters();
    if(isset($filtros['alumno']))
       $this->filters->setDefault('alumno', $filtros['alumno']);        
    return $qry;
  }


  //Recibe id de alumno por el request y muestra la pantalla de carga de acreditaciones/registra los cambios
  function executeRegistrarAcreditacion(sfWebRequest $request)
  {
    $this->getContext()->getConfiguration()->loadHelpers('I18N');
    $aid = $request['id'];
    $this->alumno = Doctrine_Core::getTable('Alumno')->find($aid);
    $this->requisitos = Doctrine_Core::getTable('Requisito')->getRequisitosPara($aid);
    
    $this->form = new sfForm() ;
    $this->form->getWidgetSchema()->setNameFormat('acreditaciones_de_'.$aid.'[%s]');
    
    $presentados_form = new sfForm();
    $presentados=0;
    $faltantes = array();
    foreach($this->requisitos as $r) {
      if($ac = $r->getAcreditacionPara($aid)) {
        $claseForm = $r->getAcreditacionClass().'Form';
        $subform = new $claseForm($ac);
        $presentados_form->embedForm(++$presentados, $subform);
      } else {
        $faltantes[] = $r;
      }      
    }
    if(count($faltantes)) {      
        $this->getUser()->addFlashMessage(
                 format_number_choice(
                   '[1] Falta entregar un requisito.|(1,+Inf] Aún faltan entregar %count% requisitos.',
                   array('%count%' => count($faltantes)),
                   count($faltantes)
                 )
        ); 
        $this->form->embedForm(
          'requisitos_faltantes',
          new AcreditacionMultiplesRequisitosForm(null, array(
            'aid' => $aid,
            'requisitos' => $faltantes
          ))
        ); 
    }
    if($presentados) {
        $this->form->embedForm(
          'requisitos_presentados', $presentados_form
        );
    }    

    if($presentados==0 && count($faltantes)==0)
        $this->getUser()->addFlashMessage('El alumno no tiene requisitos acreditados ni faltantes.');

    if($request->isMethod(sfRequest::POST)){
      $values = $request->getParameter($this->form->getName());
      $files  = $request->getFiles($this->form->getName());
      $this->form->bind( $values, $files );
      if($this->form->isValid()) {
        $aviso = '';
        if(count($faltantes)) {
          if($registrados = $this->procesarForms('requisitos_faltantes', $values, $files))
            $aviso = format_number_choice(
                       '[1] Se registró un nuevo requisito.|(1,+Inf] Se registraron %count% requisitos.',
                       array('%count%' => $registrados),
                       $registrados
                     ); 
        }
        if($presentados) {
          if($actualizados = $this->procesarForms('requisitos_presentados', $values, $files))
            $aviso = $aviso . ' ' . format_number_choice(
                                '[1] Se actualizó un requisito.|(1,+Inf] Se actualizaron %count% requisitos.',
                                array('%count%' => $actualizados),
                                $actualizados
                              ); 
        }

        if($aviso) $this->getUser()->setFlash('notice',$aviso);        
        $this->redirect('registrarAcreditacion/'.$aid);
      } else {
        $this->getUser()->setFlash('error','El elemento no fue guardado debido a algunos errores.', false);
      }      
    }    
  }

  // borra, registra o actualiza los requisitos del contenedor que recibe
  private function procesarForms($nombreContenedor, $values, $files) 
  {
    $cant_registrados=0;
    foreach($this->form->getEmbeddedForm($nombreContenedor)->getEmbeddedForms() as $idx => $sfform) {
      unset($sfform['_csrf_token']);
      $sfform->bind(
           $values[$nombreContenedor][$idx],
           (isset($files[$nombreContenedor][$idx])) ? $files[$nombreContenedor][$idx] : array()
      );
      $sfform->getObject()->merge($sfform->getValues());
      if($sfform->getValue('borrar')) {
        $sfform->getObject()->delete();
      } elseif(!$sfform->estaVacio() && $sfform->getObject()->isModified() ) {
        $sfform->save();
        $cant_registrados++;
      }
    }
    return $cant_registrados;
 }

}
